package com.hup.utils.swing.frame;

import com.hup.utils.swing.FrameUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowEvent;

/**
 * <pre>
 * {@link BaseWindow};
 * {@link JWindow}说明:
 * .支持鼠标监听,如按钮的进入退出事件
 * .不支持内容
 *  .没有界面标题, {@link #title}, {@link #baseTitle} 只用于自义定业务使用
 *  .不能获取到焦点,无法激活: {@link JTextArea}类的组件
 *  .原生不支持键盘键入
 *  .不支持显示tooltip
 * </pre>
 *
 * @author hugan
 * @date 2020/10/28
 */
@Log4j2
public class BaseJWindow extends JWindow implements BaseWindow {

    @Setter
    @Getter
    private String title;
    @Setter
    @Getter
    private String baseTitle;
    /**
     * 是否为单例窗口,默认true;
     * 使用{@link SingletonWindowHelper#getWindow(Class)}获取窗口对象
     */
    @Getter
    private boolean singleton = true;

    public BaseJWindow(String title) {
        this(null, title);
    }

    public BaseJWindow(Window owner, String title) {
        super(owner);
        setTitle(title);
        setBaseTitle(title);
        onCreate();
    }

    @Override
    public void onCreate() {
        FrameUtil.addVisibleListener(this, this);
        if (isSingleton()) SingletonWindowHelper.addWindow(this);
    }

    @Override
    public void onShown() {
        //log.info("");
    }

    /**
     * @deprecated 此方法目前没有入口/调用者
     */
    @Deprecated
    @Override
    public boolean onWindowClosing(WindowEvent e) {
        return false;
    }

    /**
     * 想隐藏窗口而不影响SingletonWindowHelper,应该使用 {@link #setVisible(boolean)}
     */
    @Override
    public void dispose() {
        super.dispose();
        if (isSingleton()) SingletonWindowHelper.removeWindow(this);
    }

    /**
     * 窗口关闭后的回调
     *
     * @param dispose true-点关闭按钮,dispose();false-setVisible(false)
     */
    @Override
    public void onHidden(boolean dispose) {
        //log.info("dispose={}", dispose);
    }

    @Override
    public void setSingleton(boolean singleton) {
        this.singleton = singleton;
        if (!isSingleton()) SingletonWindowHelper.removeWindow(this);
    }

}
